#pragma once

#include <stdint.h>

#define QMI8658C_DEV_ADDR  0x6B // QMI8658C 的 I2C 地址

// 定义 QMI8658C 寄存器地址
enum qmi8658c_reg
{
    QMI8658C_WHO_AM_I = 0x00,       // 设备标识符
    QMI8658C_REVISION_ID = 0x01,    // 设备版本 ID
    QMI8658C_CTRL1 = 0x02,          // SPI 接口和传感器使能
    QMI8658C_CTRL2 = 0x03,          // 加速度计：输出数据速率、全量程、自检
    QMI8658C_CTRL3 = 0x04,          // 陀螺仪：输出数据速率、全量程、自检
    QMI8658C_CTRL4 = 0x05,          // 磁力计设置：输出数据速率和设备选择
    QMI8658C_CTRL5 = 0x06,          // 低通滤波设置
    QMI8658C_CTRL6 = 0x07,          // AttitudeEngine™ 设置：输出数据速率、按需运动
    QMI8658C_CTRL7 = 0x08,          // 使能传感器
    QMI8658C_CTRL8 = 0x09,          // 保留：不使用
    QMI8658C_CTRL9 = 0x0A,          // 主机命令
    QMI8658C_CAL1_L = 0x0B,         // 校准寄存器 CAL1_L - 低 8 位
    QMI8658C_CAL1_H = 0x0C,         // 校准寄存器 CAL1_H - 高 8 位
    QMI8658C_CAL2_L = 0x0D,         // 校准寄存器 CAL2_L - 低 8 位
    QMI8658C_CAL2_H = 0x0E,         // 校准寄存器 CAL2_H - 高 8 位
    QMI8658C_CAL3_L = 0x0F,         // 校准寄存器 CAL3_L - 低 8 位
    QMI8658C_CAL3_H = 0x10,         // 校准寄存器 CAL3_H - 高 8 位
    QMI8658C_CAL4_L = 0x11,         // 校准寄存器 CAL4_L - 低 8 位
    QMI8658C_CAL4_H = 0x12,         // 校准寄存器 CAL4_H - 高 8 位
    QMI8658C_FIFO_WM_T_H = 0x13,    // FIFO 水位，高 8 位
    QMI8658C_FIFO_WM_T_L = 0x14,    // FIFO 水位，低 8 位
    QMI8658C_FIFO_CTRL = 0x15,      // FIFO 控制
    QMI8658C_FIFO_SMPL_CNT = 0x16,  // FIFO 样本计数
    QMI8658C_FIFO_STATUS = 0x17,    // FIFO 状态
    QMI8658C_FIFO_DATA = 0x18,      // FIFO 数据
    QMI8658C_I2CM_STATUS = 0x2C,    // I2C 主机状态
    QMI8658C_STATUSINT = 0x2D,      // 传感器数据可用性与锁定机制
    QMI8658C_STATUSOU = 0x2E,       // 输出数据运行和数据可用性
    QMI8658C_STATUSUS = 0x2F,       // 杂项状态：唤醒、运动、命令完成（CTRL9 协议位）
    QMI8658C_TIMESTAMP_LOW = 0x30,  // 时间戳低 8 位
    QMI8658C_TIMESTAMP_MID = 0x31,  // 时间戳中间 8 位
    QMI8658C_TIMESTAMP_HIGH = 0x32, // 时间戳高 8 位
    QMI8658C_TEMP_L = 0x33,         // 温度输出数据低 8 位
    QMI8658C_TEMP_H = 0x34,         // 温度输出数据高 8 位
    QMI8658C_AX_L = 0x35,           // X 轴加速度低 8 位
    QMI8658C_AX_H = 0x36,           // X 轴加速度高 8 位
    QMI8658C_AY_L = 0x37,           // Y 轴加速度低 8 位
    QMI8658C_AY_H = 0x38,           // Y 轴加速度高 8 位
    QMI8658C_AZ_L = 0x39,           // Z 轴加速度低 8 位
    QMI8658C_AZ_H = 0x3A,           // Z 轴加速度高 8 位
    QMI8658C_GX_L = 0x3B,           // X 轴角速度低 8 位
    QMI8658C_GX_H = 0x3C,           // X 轴角速度高 8 位
    QMI8658C_GY_L = 0x3D,           // Y 轴角速度低 8 位
    QMI8658C_GY_H = 0x3E,           // Y 轴角速度高 8 位
    QMI8658C_GZ_L = 0x3F,           // Z 轴角速度低 8 位
    QMI8658C_GZ_H = 0x40,           // Z 轴角速度高 8 位
    QMI8658C_MX_L = 0x41,           // X 轴磁场强度低 8 位
    QMI8658C_MX_H = 0x42,           // X 轴磁场强度高 8 位
    QMI8658C_MY_L = 0x43,           // Y 轴磁场强度低 8 位
    QMI8658C_MY_H = 0x44,           // Y 轴磁场强度高 8 位
    QMI8658C_MZ_L = 0x45,           // Z 轴磁场强度低 8 位
    QMI8658C_MZ_H = 0x46,           // Z 轴磁场强度高 8 位
    QMI8658C_dQW_L = 0x49,          // 四元数增量 dQW 低 8 位
    QMI8658C_dQW_H = 0x4A,          // 四元数增量 dQW 高 8 位
    QMI8658C_dQX_L = 0x4B,          // 四元数增量 dQX 低 8 位
    QMI8658C_dQX_H = 0x4C,          // 四元数增量 dQX 高 8 位
    QMI8658C_dQY_L = 0x4D,          // 四元数增量 dQY 低 8 位
    QMI8658C_dQY_H = 0x4E,          // 四元数增量 dQY 高 8 位
    QMI8658C_dQZ_L = 0x4F,          // 四元数增量 dQZ 低 8 位
    QMI8658C_dQZ_H = 0x50,          // 四元数增量 dQZ 高 8 位
    QMI8658C_dVX_L = 0x51,          // 速度增量沿 X 轴低 8 位
    QMI8658C_dVX_H = 0x52,          // 速度增量沿 X 轴高 8 位
    QMI8658C_dVY_L = 0x53,          // 速度增量沿 Y 轴低 8 位
    QMI8658C_dVY_H = 0x54,          // 速度增量沿 Y 轴高 8 位
    QMI8658C_dVZ_L = 0x55,          // 速度增量沿 Z 轴低 8 位
    QMI8658C_dVZ_H = 0x56,          // 速度增量沿 Z 轴高 8 位
    QMI8658C_AE_REG1 = 0x57,        // AttitudeEngine 寄存器 1
    QMI8658C_AE_REG2 = 0x58,        // AttitudeEngine 寄存器 2
    QMI8658C_RESET_REG = 0x60       // 软复位寄存器
};

#define QMI8658C_DEVICE_ID 0x05
#define QMI8658C_DATA_READY_MASK_ACCEL (1 << 0)
#define QMI8658C_DATA_READY_MASK_GYRO (1 << 1)

typedef struct {
    int16_t accel_x;
    int16_t accel_y;
    int16_t accel_z;
    int16_t gyro_x;
    int16_t gyro_y;
    int16_t gyro_z;
    float angle_x;
    float angle_y;
    float angle_z;
} t_sQMI8658C;

void qmi8658c_init(void);                           // 初始化 QMI8658C
void qmi8658c_fetch_angleFromAcc(t_sQMI8658C *p);   // 获取 QMI8658C 的角度

